import { clone } from './convert'

/**
 * 常用辅助函数
 * @module utils/util
 */

/**
 * 防抖函数
 * @param {function} fn 事件处理函数
 * @param {boolean} [isImmediate=false] 是否立刻执行
 * @param {number} [delay=20] 延迟时间
 * @param {object} [context=this] 上下文对象
 * @returns {Function} 事件处理函数
 */
export function debounce(fn, isImmediate = false, delay = 20, context = this) {
	// 使用闭包，保存执行状态，控制函数调用顺序
	let timer
	return function () {
		const _args = [].slice.call(arguments)
		clearTimeout(timer)
		const _fn = function () {
			timer = null
			if (!isImmediate) fn.apply(context, _args)
		}
		// 是否滚动时立刻执行
		const callNow = !timer && isImmediate
		timer = setTimeout(_fn, delay)
		if (callNow) fn.apply(context, _args)
	}
}

const raFrame =
	window.requestAnimationFrame ||
	window.webkitRequestAnimationFrame ||
	function (callback) {
		return window.setTimeout(callback, 1000 / 60)
	}

/**
 * 动画延时函数
 * @function
 * @param {function} callback 动画回调函数
 * @return {number} id
 */
export const requestAnimationFrame = raFrame

/**
 * 清除动画延时
 * @function
 * @param {number} id
 */
export const cancelAnimationFrame =
	window.cancelAnimationFrame ||
	window.webkitRequestAnimationFrame ||
	function (id) {
		window.clearTimeout(id)
	}

/**
 * 节流函数 isLocked在执行中时禁止后续相同函数执行
 * @param {function} fn 事件处理函数
 * @param {boolean} [isImmediate=false] 是否立刻执行
 * @param {object} [context=this] 上下文对象
 * @returns {Function} 事件处理函数
 */
export function throttle(fn, isImmediate = false, context = this) {
	let isLocked
	return function () {
		const _args = arguments
		if (isLocked) return
		isLocked = true
		raFrame(function () {
			isLocked = false
			fn.apply(context, _args)
		})
		isImmediate && fn.apply(context, _args)
	}
}

/**
 * 回显数据字典（字符串数组）
 * @param {*} datas 数组原始数据
 * @param {*} value 需要查找的值 多个时按照separator拼接
 * @param {*} separator 多个值时拼接的标识（默认为 , ）
 * @param {*} param2 需要对应的 val和key
 * @returns
 */
export function selectDictLabel(datas, value, separator = ',', { dictValue = 'dictValue', dictLabel = 'dictLabel' } = {}) {
	if (!['', undefined].includes(value)) {
		var actions = []
		var temp = String(value)?.split(separator)
		Object.keys(String(value)?.split(separator)).some((val) => {
			Object.keys(datas).some((key) => {
				if (datas[key][dictValue] == temp[val]) {
					actions.push(datas[key][dictLabel])
				}
			})
		})
		return actions.join(',')
	}
}

/**
 * 生成随机GUID
 * @return {string}
 */
export function guid() {
	return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
		.replace(/[xy]/g, function (c) {
			const r = (Math.random() * 16) | 0,
				v = c === 'x' ? r : (r & 0x3) | 0x8
			return v.toString(16)
		})
		.toUpperCase()
}

// transitionGroup切换定义参数函数
import { customRef } from 'vue'
export function transitionGroupRef(value, delay = 350) {
	return customRef((track, trigger) => ({
		get() {
			track()
			return value
		},
		set(newValue) {
			value = -1
			trigger()
			setTimeout(() => {
				value = newValue
				trigger()
			}, delay)
		}
	}))
}
